const express = require('express');
const logger = require('morgan')
const bodyParser = require('body-parser')
const favicon = require('serve-favicon')
var cookieParser = require('cookie-parser')
var session = require('express-session')
var cors = require('cors')
const path = require('path')
const ejs = require('ejs')
// global.db = require('./config/mysql'); // 设置成全局变量
const indexRouter = require('./routers/indexRouter')

const app = express()

// 配置日志中间件
app.use(logger('dev'));
// express框架后端解决跨域cors设置
app.use(cors({
  "origin": true, //true 设置为 req.origin.url
  "methods": "GET,HEAD,PUT,PATCH,POST,DELETE", //容许跨域的请求方式
  "allowedHeaders": "x-requested-with,Authorization,token, content-type", //跨域请求头
  "preflightContinue": true, // 是否通过next() 传递options请求 给后续中间件 
  "maxAge": 1728000, //options预验结果缓存时间 20天
  "credentials": true, //携带cookie跨域
  "optionsSuccessStatus": 200 //options 请求返回状态码
}))
// 配置解析请求参数的中间件（por请求/）
app.use(bodyParser.urlencoded({ extended: false }))
// 将数据转换成json格式
app.use(bodyParser.json())
//在使用 cookie-parser 中间件时，有两种使用方法，签名与否。不使用签名
app.use(cookieParser());
// 使用 express-session 中间件时。是一个保存在服务端的会话缓存
app.use(session({
  secret: 'this is string key',   // 可以随便写。 一个 String 类型的字符串，作为服务器端生成 session 的签名
  name: 'JSESSIONID',/*保存在本地cookie的一个名字 默认connect.sid  可以不设置*/
  resave: false,   /*强制保存 session 即使它并没有变化,。默认为 true。建议设置成 false。*/
  saveUninitialized: true,   //强制将未初始化的 session 存储。  默认值是true  建议设置成true
  cookie: {
    // secure: true,
    // expires: false, 
    /*过期时间,单位为毫秒*/
    // maxAge: 60000,    // 一分钟
    // maxAge: 3600000,    // 一小时
    maxAge: 86400000,    // 一天
    // maxAge: 604800000,    // 一周
    // maxAge: 2419200000,    // 一月
    // maxAge: 29030400000,    // 一年
  },   /*secure https这样的情况才可以访问cookie*/
  //设置过期时间比如是30分钟，只要游览页面，30分钟没有操作的话在过期
  rolling: false //在每次请求时强行设置 cookie，这将重置 cookie 过期时间（默认：false）
}))

// 设置请求超时
app.use((req, res, next) => {
  try {
    res.setTimeout(1000 * 60, () => {
      try {
        res.status(404);
        res.send("请求超时")
      } catch (error) {
        // res.status(404);
        // res.send("请求超时")
        console.log('error=-=-- ', error)
      }
    })
  } catch (error) {
  }
  next()
})

/* 
  加载路由中间件模块。优先级高于静态文件。
  可以配置多个路由。
  把有可能用到的路由提取拆分出来作为一个中间件，如果不这样，基础的路由导向如下：
  app.get('/login', (req, resp) => {
    resp.send("have a nice day!");
  })
  路由中间件的用法：
  app.use([path,] callback [, callback...])
  路由将匹配紧随其路径的任何路径，并带有“ /”。例如：app.use('/apple', ...)将匹配“/apple”、“/apple/images”、“/apple/images/news”等。
  由于path默认为“/”，对于应用程序的每个请求，都会执行没有路径的中间件。
*/
app.use(indexRouter)

// 配置ejs视图引擎
app.set('views', __dirname + '/src/views') // 配置视图引擎的文件路径
// app.set("view cache", true) // 启用视图模板编译缓存。
app.set("view engine", "ejs") // 配置视图引擎为ejs引擎

// 配置静态文件中间件。可以配置多个。
app.use(express.static(__dirname + '/src', {
  // 设置静态文件的请求头。
  setHeaders: function (res, path, stat) {
    // 设置浏览器缓存,缓存时间为1秒
    res.set('Cache-Control', "must-revalidate, max-age=5")
  }
}));

// 配置加载网站小图标的中间件
// app.use(favicon(__dirname + '/src/images/favicon.ico'))
app.use(favicon(path.join(__dirname, 'src', 'images', 'favicon.ico')))

// 设置404页面。没有找到资源是返回
app.use((req, res) => {
  res.status(404);
  res.redirect('/pages/404.html')
})

// 启动服务器
app.listen(8099, () => {
  console.log('服务器启动，启动端口为 8099',)
  console.log('访问：http://localhost:8099/pages/login.html',)
})

// console.log('', global)